#ifndef _LED_H
#define _LED_H
#include "main.h"
#include "font.h"
#include "spi.h"
#include "sys.h"
#include "w25q32.h"

// HUB08接口引脚定义
#define A PBout(0)
#define B PBout(2)
#define C PBout(11)
#define D PBout(13)
#define G1 PBout(15)
#define G2 PBout(4)
#define LAT PBout(6)
#define CLK PBout(8)
// 左边
#define OE PBout(14)
#define R1 PBout(3)
#define R2 PBout(5)

// LED和探针
#define LED PAout(0)

// 接口操作定义
#define DisplayON OE = 0
#define DisplayOFF OE = 1
#define Latch \
    LAT = 1;  \
    LAT = 0

// 参数
#define BUF_SIZE 6
#define SCREEN_WIDTH 64
#define US_PER_ROW 500
#define MS_PER_SHIFT ((uint32_t)10 * 1000 / US_PER_ROW)
/* 向中断函数传输数据的一个结构 */
struct display_param
{
    uint16_t new_data_in;      // 这是新数据吗
    uint16_t display_nbit;    // 显示多少个bit
    uint32_t head;            // 循环显存头位于显存哪个位置,头包含数据
    uint32_t tail;            // 循环显存尾位于显存哪个位置,尾不包含数据
    uint8_t *text_buf;        // 文字缓存区,不是点阵
    uint16_t left_shift_time; // 多久左移一位
};

extern struct display_param d;

// 缓冲区大小,多少个汉字
extern uint16_t display_buf[16 * BUF_SIZE];

void TIM1_Init(void);
volatile extern uint16_t display_nbit;    // 要移位多少位到显示器
volatile extern uint32_t head;            // 循环显存头的位置
volatile extern uint32_t tail;            // 循环显存尾的位置
volatile extern uint8_t *text_buf;        // 存储文字
volatile extern uint16_t left_shift_time; // 多久向左移一位

void clear_8x16_to_display_buf(uint16_t position);
void insert_8x16_to_display_buf(uint8_t *buf, uint16_t position);
void insert_16x16_to_display_buf(uint8_t *buf, uint16_t position);
void led_init();

/* 将点阵读到缓冲区 */
uint8_t read_font(uint8_t *buf, uint16_t GB2312_Code);

/* 显示字符 */
void display_text(uint8_t *text);
void watch();
#endif // !_LED_H